package
{
	import org.flintparticles.twoD.actions.MinimumDistance;
	import waylines.actions.Antigravities;
	import caurina.transitions.Tweener;
	import flash.display.Shape;
	import org.flintparticles.common.events.ParticleEvent;
	import flash.geom.Point;
	import org.flintparticles.twoD.particles.Particle2D;
	import flash.events.MouseEvent;
	import waylines.initializers.HealthInitializer;
	import flash.events.Event;
	
	public class MainWaylines_3 extends MainWaylines_2
	{
		public function MainWaylines_3()
		{
		}
		override protected function setup(e:Event=null):void
		{
			super.setup(e);
			// добавляем "мелким стрелкам" новое свойство - здоровье 
			emitterWaylines.addInitializer( new HealthInitializer(100));
			/*
			 * "замедлил время" для эмиттеров стрелок (больших и маленьких)
			 * по-умолчанию - .1
			 */
			emitterWaylines.maximumFrameTime = .001;
			emitterWaylinesForMonsterArrows.maximumFrameTime = .001;
			/*
			 * из-за замедления времени для эмиттеров движения стрелок, пришлось увеличить силы, действующие на частицы
			 * (ну, даже с житейской точки зрения это понятно - чтоб в маленьких промежутках времени были заметны изменения, силы нужно приложить побольше)
			 */
			emitterWaylines.addAction( new Antigravities(emitterWaylinesForMonsterArrows, -4000000) );// было 400000
			emitterWaylines.addAction( new MinimumDistance( 7, 6000 ) );// было 600
		}
		/*
		 * логика проста (в одном пункте чуть ущербна - но я не укажу где)
		 * 1. родительский метод explosion "выбивает" частицы из emitterWaylines и клонирует их в emitterExplosion
		 * 2. расширенный метод перебирает в цикле частицы и уменьшает им здоровье. 
		 * таким образом получается, что "повреждения" получают ВСЕ частицы 
		 * - и только добавленные и те, что УЖЕ накрыло предыдущим взрывом 
		 */
		override protected function explosion(e:MouseEvent):void
		{
			/*
			 * обязательный вызов родительского метода - для обработки частиц из emitterWaylines
			 */
			super.explosion(e);
			/*
			 * практически copy-paste родительского метода
			 * , нет только клонирования частиц из одного эмиттера в другой
			 */	
			if(emitterWaylines == null){ return; }
			if(emitterExplosion == null){ return; }
			
			var explRadius:int = 30;
			//var particleOrigin:Particle2D;
			var particle:Particle2D;
			var particlePoint:Point = new Point();
			
			var explPoint:Point = new Point(e.stageX, e.stageY);			
			var particles:Array = emitterExplosion.particlesArray;
			var length:int = particles.length;
			for(var r:int=0; r<length; r++)
			{
				particle = Particle2D(particles[r]);
				particlePoint.x = particle.x;
				particlePoint.y = particle.y;
				
				if(Point.distance(explPoint, particlePoint) < explRadius)
				{
					particle.angVelocity = -5 + Math.random() * 10;
					/*
					 * чуть "продлеваем жизнь" частицы во "взрывном эмиттере" - ей ведь добавляются повреждения...
					 */					
					particle.lifetime += 1;
					//particleClone.age = 0;
					/*
					 * уменьшаем здоровье у частиц внутри взрыва (от 10 до 40 единиц)
					 */
					particle.dictionary["health"] -= (10 + Math.random() * 30);
					/*
					 * если параметр здоровья меньше или равен нулю - частица удаляется из эмиттера, и запускается анимация
					 */
					if(particle.dictionary["health"] <= 0)
					{	// стрелка "убита" - добавляем кляксу
						addBlot(particle);
						// удаляем частицу
						particle.isDead = true;
					}
					else
					{ // стрелка "ранена" - изменим цвет
						Arrow(particle.image).color = getArrawColorByHealth(particle.dictionary["health"]);
					}					
				}
			}			
		}		
		override protected function handleParticleDeadFromEmitterExplosion(e:ParticleEvent):void
		{
			/*
			 * перед тем, как "перевести" частицу из emitterExplosion снова в emitterWaylines, нужно проверить здоровье
			 * если параметр здоровья равен или меньше нуля, частицу обратно не возвращать 
			 */
			var health:Number = e.particle.dictionary["health"];
			
			if(health > 0)
			{
				var clone:Particle2D = e.particle.clone(emitterWaylines.particleFactory) as Particle2D;
				if(health < 100)
				{
					clone.image = new Arrow(4, getArrawColorByHealth(health));
				}
				else
				{
					clone.image = new Arrow(4);
				}
				clone.angVelocity = 0;
				clone.isDead = false;				
				emitterWaylines.addParticle(clone);
			}
		}
		/*
		 * метод возвращает цвет в зависимости от количества здоровья (оттенки красного)
		 */
		protected function getArrawColorByHealth(health:Number):Number
		{
			var red:int = 255;
			var gb:String = Math.max(health/100 * 255, 0).toString(16);
			if(gb.length == 1)
			{
				gb = "0"+gb;
			}
			return Number("0x" + red.toString(16) + gb + gb);
		}
		protected function addBlot(particle:Particle2D):void
		{
			var blot:Shape = addChildAt(new Blot(5, 0x007700), 0) as Shape;
				blot.x = particle.x;
				blot.y = particle.y;
				blot.rotation = Math.floor(Math.random() * 100);			
			Tweener.addTween(blot, {time:5, alpha:0, scaleX:3, scaleY:2, transition:"easeInExpo", onComplete:function():void{ blot.parent.removeChild(blot); }});
		}
	}
}
